<?php
/**
* Fichier de la class Reponse.
* 
* PHP version 5.1.6
*
* @package   Smartbok
* @author    Christophe Hebet <christophe.hebet@dgfip.finances.gouv.fr> 
* @copyright 2013 - DGFiP
*/

/**
 * Class Reponse. Cette classe traite les informations pour les renvoyer au navigateur.
 * @author Christophe Hebet <christophe.hebet@dgfip.finances.gouv.fr>
 *
 */
class SmartbokReponse 
{
    /**
     * variable de stokage des templates
     * @var array
     */
    private $_templates;
    /**
     * variable de type tableau qui contiendra toutes les variables a passer aux templates. Initialisée avec la 
     * variable bodyJs qui contient les script a passer sur la balise body
     * @var array
     */
    private $_vars= array('bodyJs' => '');
    /**
     * Contient le html a tansmettre au navigateur après affectation et traitement.
     * @var string
     */
    private $_body;
    /**
     * contient le menu de l'application sous forme html
     * @var string
     */
    private $_menu;
    /**
     * Variable de stockage des variable applicatives pour exploitation avant affichage.
     * Initialisée avec des tableaux vides pour les css, metas, js et menu
     * @var array
     */
    private $_appVars= array('css'=>array(), 'metas' => array(), 'js' => array(), 'menu' => array());
    
    /**
     * contient l'ensemble des variable javascript a ajouter en entete du fichier
     * @var array
     */
    private $_jsVars;
    
    /**
     * Contructeur. remplit les tableaux des variables applicatives
     * @param array $appVars
     */
    public function __construct($appVars) {
        $this->_appVars = array_merge($this->_appVars, $appVars);
    }
    
    /**
     * Méthode d'ajout de template
     * @param string $template
     */
    public function addTemplate($template) {
        $this->_templates[] = $template;
    }
    
    /**
     * méthode de lecture du tableau des templates
     * @return array:
     */
    public function getTemplates() {
        return $this->_templates;
    }
    
    /**
     * Méthode de collecte des variables nécessaires à l'affichage
     * @return array
     */
    public function getVars() {
        $vars = $this->_vars;
        $vars = array_merge_recursive($vars, $this->_appVars);
        $vars = $this->_convertirVarHtml($vars);
        $vars['templates'] = $this->_templates;
        $vars['jsVars'] = $this->_jsVars;
        return $vars;        
    }
    
    private function _convertirVarHtml($vars) {
        if ($this->_appVars['forceEncodageHtml'] === true) {
           // $vars = $this->_forceHtmlSpecialChars($vars);
            return $vars;
        }
        else {
            return $vars;
        }
    }
    
    private function _forceHtmlSpecialChars($vars) {
        foreach ($vars as &$var) {
            if (is_array($var) === true) {
                $var = $this->_forceHtmlSpecialChars($var);
            }
            else {
                $var = htmlspecialchars($var);
            }
        }
        return $vars;
    }
    /**
     * méthode de transfert du corps de la page au controller pour affichage
     * @return string
     */
    public function display() {
        return $this->_body;
    }
    
    /**
     * méthode d'affectation du résultat avant passage au controller
     * @param string $value
     */
    public function preparer($value) {

        if($this->_appVars['forceEncodageCharset'] === true) {
            header('Content-type: text/html; charset='.$this->_appVars['charset']);
        }
        $this->_body = $value;
        
    } 
    
    /**
     * méthode d'affectation des variables
     * @param string $key
     * @param multitype $value
     */
    public function addVar($key, $value)
    {
        $this->_vars[$key] = $value;
    }
    
    /**
     * méthode d'affectation des variables
     * @param string $key
     * @param multitype $value
     */
    public function addJsVar($key, $value)
    {
        $this->_jsVars[$key] = $value;
    }
    
    /**
     * méthode de collecte des variables utilisées par le controller
     * @param string $key
     * @return multitype:
     */
    public function getVar($key)
    {
        if (isset($this->_vars[$key]) === true){
            return $this->_vars[$key];
        }
        elseif (isset($this->_appVars[$key]) === true) {           
            return $this->_appVars[$key];
        }
    }
    
    public function addProfils($profil) {        
        $this->_appVars['menu']['profils'][] = $profil;        
    }
    
    public function changeAppVar($var, $value, $tableau= null) {
        if ($tableau !== null) {
            $this->_appVars[$tableau][$var] = $value;
        }
        else {
            $this->_appVars[$var] = $value;
        }    
    }   
     
    /**
     * fonction qui pert l'ajout d'une variable aux variables applicatives pour la durée du traitement
     * Cette méthode est notamment utile pour l'ajout de feuille de style ou de javascript spécifique a certaines
     * pages.
     * Le nom et la catégorie peuvent être null. Si le nom est null, la variable sera ajouter directement aux 
     * variables applicatives ou au sous ensemble des variables applicative si la catégorie est spécifiée.
     * @param string $varName
     * @param multitype $varValue
     * @param string $varCategorie
     */
    public function ajouterVariableApplicative($varValue, $varName= null, $varCategorie= null) {
        if (isset($varCategorie) === true && ($this->_appVars[$varCategorie] !== null)) {
            if(is_null($varName) === true) {
                $this->_appVars[$varCategorie][] = $varValue;
            }
            else {
                $this->_appVars[$varCategorie][$varName] = $varValue;
            }
        }
        else {
            $this->_appVars[$varName] = $varValue;
        }
    }
    /*
     * voir si nécessité de faire les redirections avec gestion des headers
     */
}